home *** CD-ROM | disk | FTP | other *** search
/ The Java 3D API Specification (2nd Edition) / The Java 3D API Specification (2nd Edition).iso / programs / examples / AlternateAppearance / AlternateAppearanceBoundsTest.java < prev    next >
Text File  |  2000-04-28  |  9KB  |  288 lines

  1. /*
  2.  *    @(#)AlternateAppearanceBoundsTest.java 1.4 00/02/10 13:13:37
  3.  *
  4.  * Copyright (c) 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
  7.  * modify and redistribute this software in source and binary code form,
  8.  * provided that i) this copyright notice and license appear on all copies of
  9.  * the software; and ii) Licensee does not utilize the software in a manner
  10.  * which is disparaging to Sun.
  11.  *
  12.  * This software is provided "AS IS," without a warranty of any kind. ALL
  13.  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
  14.  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  15.  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
  16.  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
  17.  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
  18.  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
  19.  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
  20.  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
  21.  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
  22.  * POSSIBILITY OF SUCH DAMAGES.
  23.  *
  24.  * This software is not designed or intended for use in on-line control of
  25.  * aircraft, air traffic, aircraft navigation or aircraft communications; or in
  26.  * the design, construction, operation or maintenance of any nuclear
  27.  * facility. Licensee represents and warrants that it will not use or
  28.  * redistribute the Software for such purposes.
  29.  */
  30.  
  31. import java.applet.Applet;
  32. import java.awt.*;
  33. import java.awt.event.*;
  34. import com.sun.j3d.utils.applet.MainFrame;
  35. import com.sun.j3d.utils.geometry.*;
  36. import com.sun.j3d.utils.universe.*;
  37. import javax.media.j3d.*;
  38. import javax.vecmath.*;
  39. import javax.swing.*;
  40. import javax.swing.event.*;
  41. import javax.swing.border.*;
  42. import com.sun.j3d.utils.behaviors.mouse.*;
  43.  
  44. public class AlternateAppearanceBoundsTest extends JApplet 
  45. implements ActionListener {
  46.  
  47.  
  48.     Material mat1, altMat;               
  49.     Appearance app, otherApp;               
  50.     JComboBox altAppMaterialColor;
  51.     JComboBox appMaterialColor;
  52.     JCheckBox useBoundingLeaf;
  53.     JCheckBox override;
  54.     JComboBox boundsType;
  55.     private Group content1 = null;
  56.     AlternateAppearance altApp;
  57.     Shape3D[] shapes1;
  58.     boolean boundingLeafOn = false;
  59.     // Globally used colors
  60.    Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
  61.    Color3f red = new Color3f(1.0f, 0.0f, 0.0f);
  62.    Color3f green = new Color3f(0.0f, 1.0f, 0.0f);
  63.    Color3f blue = new Color3f(0.0f, 0.0f, 1.0f);
  64.    Color3f[] colors = {white, red, green, blue};
  65.     
  66.     private Bounds worldBounds = new BoundingSphere(
  67.         new Point3d( 0.0, 0.0, 0.0 ),  // Center
  68.         1000.0 );                      // Extent
  69.     private Bounds smallBounds = new BoundingSphere(
  70.         new Point3d( 0.0, 0.0, 0.0 ),  // Center
  71.         0.25 );                         // Extent
  72.     private Bounds tinyBounds = new BoundingSphere(
  73.         new Point3d( 0.0, 0.0, 0.0 ),  // Center
  74.         0.05 );                         // Extent
  75.     private BoundingLeaf leafBounds = null;
  76.     private int currentBounds = 2;
  77.  
  78.     private Bounds[] allBounds = {tinyBounds, smallBounds, worldBounds};
  79.  
  80.     DirectionalLight light1 = null;
  81.  
  82.     // Get the current bounding leaf position
  83.     private int currentPosition = 0;
  84.     //    Point3f pos = (Point3f)positions[currentPosition].value;
  85.     
  86.  
  87.     public AlternateAppearanceBoundsTest() {
  88.     Container contentPane = getContentPane();
  89.     
  90.         Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
  91.         contentPane.add("Center", c);
  92.  
  93.         BranchGroup scene = createSceneGraph();
  94.         // SimpleUniverse is a Convenience Utility class
  95.         SimpleUniverse u = new SimpleUniverse(c);
  96.  
  97.         // This will move the ViewPlatform back a bit so the
  98.         // objects in the scene can be viewed.
  99.         u.getViewingPlatform().setNominalViewingTransform();
  100.         u.addBranchGraph(scene);
  101.  
  102.  
  103.     // Create GUI
  104.     JPanel p = new JPanel();
  105.     BoxLayout boxlayout = new BoxLayout(p, 
  106.                         BoxLayout.Y_AXIS);
  107.     p.add(createBoundsPanel());
  108.     p.add(createMaterialPanel());
  109.     p.setLayout(boxlayout);
  110.     
  111.     contentPane.add("South", p);
  112.  
  113.  
  114.     }
  115.     BranchGroup createSceneGraph() {
  116.     BranchGroup objRoot = new BranchGroup();
  117.  
  118.     // Create an alternate appearance
  119.     otherApp = new Appearance();
  120.     altMat = new Material();
  121.     altMat.setCapability(Material.ALLOW_COMPONENT_WRITE);
  122.     altMat.setDiffuseColor( new Color3f( 0.0f, 1.0f, 0.0f ) );
  123.     otherApp.setMaterial(altMat);
  124.  
  125.     altApp = new AlternateAppearance();
  126.     altApp.setAppearance(otherApp);
  127.     altApp.setCapability(AlternateAppearance.ALLOW_BOUNDS_WRITE);
  128.     altApp.setCapability(AlternateAppearance.ALLOW_INFLUENCING_BOUNDS_WRITE);
  129.     altApp.setInfluencingBounds( worldBounds );
  130.     objRoot.addChild(altApp);
  131.     
  132.     // Build foreground geometry
  133.     Appearance app1 = new Appearance();
  134.     mat1 = new Material();
  135.     mat1.setCapability(Material.ALLOW_COMPONENT_WRITE);
  136.     mat1.setDiffuseColor( new Color3f( 1.0f, 0.0f, 0.0f ) );
  137.     app1.setMaterial(mat1);
  138.     content1 = new SphereGroup(
  139.                    0.05f,   // radius of spheres
  140.                    0.15f,    // x spacing
  141.                    0.15f,   // y spacing
  142.                    5,       // number of spheres in X
  143.                    5,       // number of spheres in Y
  144.                    app1, // appearance
  145.                    true);  // alt app override = true
  146.     objRoot.addChild( content1 );
  147.     shapes1 = ((SphereGroup)content1).getShapes();
  148.     
  149.  
  150.  
  151.     // Add lights
  152.     light1 = new DirectionalLight( );
  153.     light1.setEnable( true );
  154.     light1.setColor( new Color3f(0.2f, 0.2f, 0.2f) );
  155.     light1.setDirection( new Vector3f( 1.0f, 0.0f, -1.0f ) );
  156.     light1.setInfluencingBounds( worldBounds );
  157.     light1.setCapability(
  158.                 DirectionalLight.ALLOW_INFLUENCING_BOUNDS_WRITE );
  159.     light1.setCapability(
  160.                 DirectionalLight.ALLOW_BOUNDS_WRITE );
  161.     objRoot.addChild( light1 );
  162.  
  163.     // Add an ambient light to dimly illuminate the rest of
  164.     // the shapes in the scene to help illustrate that the
  165.     // directional lights are being scoped... otherwise it looks
  166.     // like we're just removing shapes from the scene
  167.     AmbientLight ambient = new AmbientLight( );
  168.     ambient.setEnable( true );
  169.     ambient.setColor( new Color3f(1.0f, 1.0f, 1.0f) );
  170.     ambient.setInfluencingBounds( worldBounds );
  171.     objRoot.addChild( ambient );
  172.     
  173.  
  174.     // Define a bounding leaf
  175.     leafBounds = new BoundingLeaf( allBounds[currentBounds] );
  176.     leafBounds.setCapability( BoundingLeaf.ALLOW_REGION_WRITE );
  177.     objRoot.addChild( leafBounds );
  178.     if (boundingLeafOn) {
  179.         altApp.setInfluencingBoundingLeaf(leafBounds);
  180.     }
  181.     else {
  182.         altApp.setInfluencingBounds(allBounds[currentBounds]);
  183.     }
  184.         
  185.     
  186.  
  187.     return objRoot;
  188.     }
  189.     JPanel createBoundsPanel() {
  190.     JPanel panel = new JPanel();
  191.     panel.setBorder(new TitledBorder("Scopes"));
  192.  
  193.  
  194.     String boundsValues[] = { "Tiny Bounds", "Small Bounds", "Big Bounds"};
  195.  
  196.     boundsType = new JComboBox(boundsValues);
  197.     boundsType.addActionListener(this);
  198.     boundsType.setSelectedIndex(2);
  199.     panel.add(new JLabel("Bounds"));     
  200.     panel.add(boundsType);
  201.  
  202.     useBoundingLeaf = new JCheckBox("Enable BoundingLeaf", 
  203.                       boundingLeafOn);
  204.     useBoundingLeaf.addActionListener(this);
  205.     panel.add(useBoundingLeaf);
  206.  
  207.     override = new JCheckBox("Enable App Override", 
  208.                       false);
  209.     override.addActionListener(this);
  210.     panel.add(override);
  211.  
  212.     return panel;
  213.  
  214.     }
  215.  
  216.     JPanel createMaterialPanel() {
  217.     JPanel panel = new JPanel();
  218.     panel.setBorder(new TitledBorder("Appearance Attributes"));
  219.  
  220.     String colorVals[] = { "WHITE", "RED", "GREEN", "BLUE"};
  221.  
  222.     altAppMaterialColor = new JComboBox(colorVals);
  223.     altAppMaterialColor.addActionListener(this);
  224.     altAppMaterialColor.setSelectedIndex(2);
  225.     panel.add(new JLabel("Alternate Appearance MaterialColor"));     
  226.     panel.add(altAppMaterialColor);
  227.     
  228.  
  229.  
  230.     appMaterialColor = new JComboBox(colorVals);
  231.     appMaterialColor.addActionListener(this);
  232.     appMaterialColor.setSelectedIndex(1);
  233.     panel.add(new JLabel("Normal Appearance MaterialColor"));     
  234.     panel.add(appMaterialColor);
  235.     
  236.     return panel;
  237.  
  238.  
  239.     }
  240.  
  241.     public void actionPerformed(ActionEvent e) {
  242.     int i;
  243.     
  244.     Object target = e.getSource();
  245.     if (target == altAppMaterialColor) {
  246.         altMat.setDiffuseColor(colors[altAppMaterialColor.getSelectedIndex()]);
  247.     }
  248.     else if (target == useBoundingLeaf) {
  249.         boundingLeafOn = useBoundingLeaf.isSelected();
  250.         if (boundingLeafOn) {
  251.         leafBounds.setRegion(allBounds[currentBounds]);
  252.         altApp.setInfluencingBoundingLeaf( leafBounds );
  253.         }
  254.         else {
  255.         altApp.setInfluencingBoundingLeaf( null );
  256.         altApp.setInfluencingBounds(allBounds[currentBounds]);
  257.         }
  258.  
  259.     }
  260.     else if (target == boundsType) {
  261.         currentBounds = boundsType.getSelectedIndex();
  262.         if (boundingLeafOn) {
  263.         leafBounds.setRegion(allBounds[currentBounds]);
  264.         altApp.setInfluencingBoundingLeaf( leafBounds );
  265.         }
  266.         else {
  267.         altApp.setInfluencingBoundingLeaf( null );
  268.         altApp.setInfluencingBounds(allBounds[currentBounds]);
  269.         }
  270.         
  271.     }
  272.     else if (target == override) {
  273.         for (i = 0; i < shapes1.length; i++)
  274.         shapes1[i].setAppearanceOverrideEnable(override.isSelected());
  275.     }
  276.     else if (target == appMaterialColor) {
  277.         mat1.setDiffuseColor(colors[appMaterialColor.getSelectedIndex()]);
  278.     }
  279.  
  280.     }
  281.                
  282.                
  283.     public static void main(String[] args) {
  284.     Frame frame = new MainFrame(new AlternateAppearanceBoundsTest(), 800, 800);
  285.     }
  286.  
  287. }               
  288.